#include <linux/module.h>
#include <linux/interrupt.h>
#include <linux/kernel.h>

MODULE_LICENSE("GPL");

// 定义任务let结构体
static struct tasklet_struct my_tasklet;

// 任务let处理函数
static void tasklet_handler(unsigned long data)
{
    printk(KERN_ALERT "Hello World! Tasklet is working...\n");
}

// 初始化模块时调用的函数
static int __init mytasklet_init(void)
{
    printk(KERN_ALERT "Start tasklet module...\n");

    // 初始化 tasklet
    tasklet_init(&my_tasklet, tasklet_handler, 0); // 使用 handler 和数据 0 初始化 tasklet

    // 调度 tasklet
    tasklet_schedule(&my_tasklet);

    return 0; // 初始化成功
}

// 卸载模块时调用的函数
static void __exit mytasklet_exit(void)
{
    tasklet_kill(&my_tasklet); // 终止任务let

    printk(KERN_ALERT "Exit tasklet module...\n");
}

module_init(mytasklet_init);   // 加载时调用 mytasklet_init
module_exit(mytasklet_exit);   // 卸载时调用 mytasklet_exit

